home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / games_d / oasys.zip / OAD.C < prev    next >
C/C++ Source or Header  |  1991-02-04  |  4KB  |  283 lines

  1. #include    <string.h>
  2. #include    <rwlib.h>
  3. #include    "ins.h"
  4.  
  5. struct instruction
  6. {
  7.     int op;
  8.     int i;
  9. };
  10.  
  11. int file;
  12. char **vocab;
  13.  
  14. char *typenames[] =
  15. {
  16.     "VOID",
  17.     "INT",
  18.     "STR",
  19.     "OBJECT",
  20. };
  21.  
  22. char *mnemonics[] =
  23. {
  24.     "JMP",
  25.     "JF",
  26.     "JT",
  27.     "INT",
  28.     "OR",
  29.     "AND",
  30.     "NOT",
  31.     "REFLOCALVAR",
  32.     "REFARG",
  33.     "REFGLOBALVAR",
  34.     "REFPROPERTY",
  35.     "DEREF",
  36.     "CALLPROC",
  37.     "CALLFUNC",
  38.     "ASSIGN",
  39.     "DESTROY",
  40.     "CREATE",
  41.     "EXIT",
  42.     "QUIT",
  43.     "THIS",
  44.     "RETPROC",
  45.     "RETFUNC",
  46.     "EXISTS",
  47.     "OBJECT",
  48.     "PRINTINT",
  49.     "PRINTSTR",
  50.     "SAVE",
  51.     "LOAD",
  52.     "MINUS",
  53.     "ADD",
  54.     "SUB",
  55.     "MUL",
  56.     "DIV",
  57.     "MOD",
  58.     "EQ",
  59.     "NE",
  60.     "GT",
  61.     "LT",
  62.     "GE",
  63.     "LE",
  64.     "OEQ",
  65.     "ONE",
  66.     "RANDOM",
  67.     "IS",
  68.     "NEXT",
  69. };
  70.  
  71. char args[] =
  72. {
  73.     1,
  74.     1,
  75.     1,
  76.     1,
  77.     0,
  78.     0,
  79.     0,
  80.     1,
  81.     1,
  82.     1,
  83.     1,
  84.     0,
  85.     1,
  86.     1,
  87.     0,
  88.     0,
  89.     1,
  90.     0,
  91.     0,
  92.     0,
  93.     0,
  94.     0,
  95.     0,
  96.     0,
  97.     0,
  98.     0,
  99.     0,
  100.     0,
  101.     0,
  102.     0,
  103.     0,
  104.     0,
  105.     0,
  106.     0,
  107.     0,
  108.     0,
  109.     0,
  110.     0,
  111.     0,
  112.     0,
  113.     0,
  114.     0,
  115.     0,
  116.     1,
  117.     0,
  118. };
  119.  
  120. readint ()
  121. {
  122.     int i;
  123.     Read (file,&i,sizeof (int));
  124.     return i;
  125. }
  126.  
  127. main (int argc,char **argv)
  128. {
  129.     int n,i,j,k;
  130.     instruction *I;
  131.     static char buf[10240];
  132.  
  133.     if (argc != 2 || !strcmp (argv[1],"?"))
  134.         perr ("Object-Oriented Adventure Disassembler" VERSION "\n"
  135.                 "Usage: oad filename");
  136.  
  137.     file = Open (argv[1]);
  138.  
  139.     Read (file,buf,4);
  140.     if (memcmp (buf,"oas",4))
  141.         perr ("Not an OASYS file");
  142.  
  143.     n = readint ();
  144.     printf ("%d strings\n\n",n);
  145.     while (--n >= 0)
  146.     {
  147.         i = readint ();
  148.         Read (file,buf,i);
  149.         buf[i] = 0;
  150.         for (i=0 ; buf[i] ; i++)
  151.             if (buf[i] < 32 || buf[i] > 126)
  152.                 buf[i] = '*';
  153.         printf ("\"%s\"\n",buf);
  154.     }
  155.     putchar ('\n');
  156.  
  157.     n = readint ();
  158.     printf ("%d variables\n\n",n);
  159.     while (--n >= 0)
  160.         printf ("%s\n",typenames[readint ()]);
  161.     putchar ('\n');
  162.  
  163.     n = readint ();
  164.     printf ("%d properties\n\n",n);
  165.     while (--n >= 0)
  166.         printf ("%s\n",typenames[readint ()]);
  167.     putchar ('\n');
  168.  
  169.     n = readint ();
  170.     printf ("%d words\n\n",n);
  171.     vocab = new char *[n];
  172.     for (i=0 ; i<n ; i++)
  173.     {
  174.         j = readint ();
  175.         vocab[i] = new char[j+1];
  176.         Read (file,vocab[i],j);
  177.         vocab[i][j] = 0;
  178.         printf ("%s\n",vocab[i]);
  179.     }
  180.     putchar ('\n');
  181.  
  182.     n = readint ();
  183.     printf ("%d classes\n\n",n);
  184.     while (--n >= 0)
  185.     {
  186.         putchar ('{');
  187.         i = readint ();
  188.         while (--i >= 0)
  189.         {
  190.             putchar ('{');
  191.             j = readint ();
  192.             while (--j >= 0)
  193.             {
  194.                 printf (vocab[readint ()]);
  195.                 if (j)
  196.                     putchar (' ');
  197.             }
  198.             putchar ('}');
  199.         }
  200.         printf ("}\n");
  201.     }
  202.     putchar ('\n');
  203.  
  204.     n = readint ();
  205.     printf ("%d methods\n\n",n);
  206.     printf ("Init method = %d\n\n",readint ());
  207.     printf ("Select addressee method = %d\n\n",readint ());
  208.     while (--n >= 0)
  209.     {
  210.         printf ("Method %s\n\n",typenames[readint ()]);
  211.         i = readint ();
  212.         printf ("%d arguments\n\n",i);
  213.         if (i)
  214.         {
  215.             do
  216.             {
  217.                 j = readint ();
  218.                 k = readint ();
  219.                 printf ("Type %s Selector %d\n",typenames[j],k);
  220.             }
  221.             while (--i > 0);
  222.             putchar ('\n');
  223.         }
  224.         i = readint ();
  225.         printf ("%d variables\n\n",i);
  226.         if (i)
  227.         {
  228.             do
  229.                 printf ("%s\n",typenames[readint ()]);
  230.             while (--i > 0);
  231.             putchar ('\n');
  232.         }
  233.         i = readint ();
  234.         if (i)
  235.         {
  236.             putchar ('{');
  237.             while (--i >= 0)
  238.             {
  239.                 putchar ('{');
  240.                 j = readint ();
  241.                 while (--j >= 0)
  242.                 {
  243.                     k = readint ();
  244.                     if (k >= 0)
  245.                         printf (vocab[k]);
  246.                     else
  247.                         printf ("<%d>",~k);
  248.                     if (j)
  249.                         putchar (' ');
  250.                 }
  251.                 putchar ('}');
  252.             }
  253.             printf ("}\n\n");
  254.         }
  255.         printf ("Message %d\n\n",readint ());
  256.         i = readint ();
  257.         if (i)
  258.         {
  259.             I = new instruction[i];
  260.             Read (file,I,i * sizeof (instruction));
  261.             for (j=0 ; j<i ; j++)
  262.             {
  263.                 int op = I[j].op;
  264.                 char *s = mnemonics[op];
  265.                 printf (s);
  266.                 if (args[op])
  267.                 {
  268.                     k = 16 - strlen (s);
  269.                     do
  270.                         putchar (' ');
  271.                     while (--k > 0);
  272.                     printf ("%d",I[j].i);
  273.                 }
  274.                 putchar ('\n');
  275.             }
  276.             delete I;
  277.         }
  278.         putchar ('\n');
  279.     }
  280.  
  281.     return 0;
  282. }
  283.